package com.qm.chp03operator;

/**
 * @author wb
 * @date 2023-06-10 10:41
 * @description: 位运算符
 */
public class Myoperator4 {
    public static void main(String[] args) {
//        从程序的输出结果可以看得出来，60 的二进制是 0011 1100（用 0 补到 8 位），13 的二进制是 0000 1101。
        System.out.println(Integer.toBinaryString(60)); // 111100
        System.out.println(Integer.toBinaryString(13)); // 1101

        int a = 60, b = 13;
        System.out.println("a 的二进制：" + Integer.toBinaryString(a)); // 111100
        System.out.println("b 的二进制：" + Integer.toBinaryString(b)); // 1101
        int c = a & b;
        System.out.println("a & b：" + c + "，二进制是：" + Integer.toBinaryString(c));
        c = a | b;
        System.out.println("a | b：" + c + "，二进制是：" + Integer.toBinaryString(c));
        c = a ^ b;
        System.out.println("a ^ b：" + c + "，二进制是：" + Integer.toBinaryString(c));
        c = ~a;
        System.out.println("~a：" + c + "，二进制是：" + Integer.toBinaryString(c));
        c = a << 2;
        System.out.println("a << 2：" + c + "，二进制是：" + Integer.toBinaryString(c));
        c = a >> 2;
        System.out.println("a >> 2：" + c + "，二进制是：" + Integer.toBinaryString(c));
        c = a >>> 2;
        System.out.println("a >>> 2：" + c + "，二进制是：" + Integer.toBinaryString(c));
//        逻辑非运算符（!）：用来反转条件的结果，如果条件为 true，则逻辑非运算符将得到 false。
//        单逻辑与运算符（&）：很少用，因为不管第一个条件为 true 还是 false，依然会检查第二个。
//        单逻辑或运算符（|）：也会检查第二个条件。
//        也就是说，& 和 | 性能不如 && 和 ||，但用法一样：
        //定义变量
        int i = 10;
        int j = 20;
        int k = 30;

//& “与”，并且的关系，只要表达式中有一个值为false，结果即为false
        System.out.println((i > j) & (i > k)); //false & false,输出false
        System.out.println((i < j) & (i > k)); //true & false,输出false
        System.out.println((i > j) & (i < k)); //false & true,输出false
        System.out.println((i < j) & (i < k)); //true & true,输出true
        System.out.println("--------");

//| “或”，或者的关系，只要表达式中有一个值为true，结果即为true
        System.out.println((i > j) | (i > k)); //false | false,输出false
        System.out.println((i < j) | (i > k)); //true | false,输出true
        System.out.println((i > j) | (i < k)); //false | true,输出true
        System.out.println((i < j) | (i < k)); //true | true,输出true
        System.out.println("--------");

//^ “异或”，相同为false，不同为true
        System.out.println((i > j) ^ (i > k)); //false ^ false,输出false
        System.out.println((i < j) ^ (i > k)); //true ^ false,输出true
        System.out.println((i > j) ^ (i < k)); //false ^ true,输出true
        System.out.println((i < j) ^ (i < k)); //true ^ true,输出false
        System.out.println("--------");

//! “非”，取反
        System.out.println((i > j)); //false
        System.out.println(!(i > j)); //!false，,输出true
    }
}
